package bingfa

import (
	"fmt"
	"sync"
)

func Test1()  {
	//创建一个无缓冲的通道，接收匹配的结果
	results:=make(chan byte)

	//构造一个waitGroup，以便处理所有的数据源
	var waitGroup sync.WaitGroup
	//设置需要等待处理
	//设置每个切片的数量
	waitGroup.Add(3)//分别表示数字，大写字母，小写字母
	//为每一个切片启动一个goroutine来进行加入
	for i:=1;i<=3;i++{
		i2:= i
		go func() {
			getByte(i2,results)
			waitGroup.Done()
		}()
	}
	//启动一个goroutine来监控是否所有的工作都做完了
	go func() {
		//等待所有任务完成
		waitGroup.Wait()
		//用关闭通道的方式，通知Display函数
		//可以退出程序了
		close(results)
	}()

	fmt.Println("还没有开始遍历")

	//启动函数，显示返回的结果，并且在最后一个结果显示完返回
	display(results)
}
func display(results chan byte){
	//display从每个单独的goroutine接收到结果后在终端窗口输出
	//通道一直会被阻塞，直到有结果写入
	//一旦通道关闭，for循环就会终止
	for result:=range results{//这边出来，那边才能出来
		fmt.Println("输出的是",string(result))
	}
}
func getByte(flag int,results chan byte){
	if flag==1{
		for i:='1';i<='9';i++{
			//fmt.Println("输入的是",string(i))
			results<-byte(i)
			fmt.Println("压进",string(i))
		}
	}else if flag==2{
		for i:='a';i<='z';i++{
			//fmt.Println("输入的是",string(i))
			results<-byte(i)
			fmt.Println("压进",string(i))
		}
	}else if flag==3{
		for i:='A';i<='Z';i++{
			//fmt.Println("输入的是",string(i))
			results<-byte(i)
			fmt.Println("压进",string(i))
		}
	}
}